function __init__cora()
    DEPNAME = "Cora"
    # LINK = "https://github.com/shchur/gnn-benchmark/raw/master/data/npz"
    # LINK = "https://github.com/abojchevski/graph2gauss/raw/master/data/"
    LINK = "https://github.com/kimiyoung/planetoid/raw/master/data"
    DOCS = "https://github.com/kimiyoung/planetoid"
    DATA = "ind.cora." .* ["x", "y", "tx", "allx", "ty", "ally", "graph", "test.index"]

    register(DataDep(DEPNAME,
                     """
                     Dataset: The $DEPNAME dataset.
                     Website: $DOCS
                     """,
                     map(x -> "$LINK/$x", DATA),
                     "81de017067dc045ebdb8ffd5c0e69a209973ffdb1fe2d5b434e94d3614f3f5c7"  # if checksum omitted, will be generated by DataDeps
                     # post_fetch_method = unpack
                     ))
end

"""
    Cora()

The Cora citation network dataset from Ref. [1].
Nodes represent documents and edges represent citation links.
Each node has a predefined feature with 1433 dimensions. 
The dataset is designed for the node classification task. 
The task is to predict the category of certain paper.
The dataset is retrieved from Ref. [2].

# Statistics 

- Nodes: 2708
- Edges: 10556
- Number of Classes: 7
- Label split:
    - Train:  140
    - Val:    500
    - Test:  1000

The split is the one used in the original paper [1] and 
doesn't consider all nodes.


# References

[1]: [Deep Gaussian Embedding of Graphs: Unsupervised Inductive Learning via Ranking](https://arxiv.org/abs/1707.03815)

[2]: [Planetoid](https://github.com/kimiyoung/planetoid)
"""
struct Cora <: AbstractDataset
    metadata::Dict{String, Any}
    graphs::Vector{Graph}
end

function Cora(; dir = nothing, reverse_edges = true)
    metadata, g = read_planetoid_data("Cora", dir = dir, reverse_edges = reverse_edges)
    return Cora(metadata, [g])
end

Base.length(d::Cora) = length(d.graphs)
Base.getindex(d::Cora, ::Colon) = d.graphs[1]
Base.getindex(d::Cora, i) = getindex(d.graphs, i)

# DEPRECATED in v0.6.0
function Base.getproperty(::Type{Cora}, s::Symbol)
    if s === :dataset
        @warn "Cora.dataset() is deprecated, use `Cora()` instead."
        function dataset(; dir = nothing)
            d = Cora(; dir)
            g = d[1]
            adjacency_list = edgeindex2adjlist(g.edge_index..., g.num_nodes)
            return (; g.num_nodes, g.num_edges,
                    node_features = g.node_data.features,
                    node_labels = g.node_data.targets,
                    train_indices = mask2indexes(g.node_data.train_mask),
                    val_indices = mask2indexes(g.node_data.val_mask),
                    test_indices = mask2indexes(g.node_data.test_mask),
                    adjacency_list)
        end
        return dataset
    else
        return getfield(Cora, s)
    end
end
